﻿jQuery.extend(jQuery.validator, {
    checkDate: function(value) {
        var date = $.parseDate(value);
        return (date != null);
    }
});

jQuery.validator.addMethod("dateRU", function(value, element) {
    return this.optional(element) || jQuery.validator.checkDate(value);
}, "Please, enter date in dd.mm.yyyy format, e.g. 25.06.1985");

jQuery.validator.addMethod("dateTimeRU", function(value, element) {
    return this.optional(element) || jQuery.validator.checkDate(value);
}, "Please, enter date in dd.mm.yyyy hh:mm format, e.g. 25.06.1985 12:00");

jQuery.validator.addMethod("maxWords", function(value, element, params) { 
    return this.optional(element) || value.match(/\b\w+\b/g).length < params; 
}, "Please enter {0} words or less."); 
 
jQuery.validator.addMethod("minWords", function(value, element, params) { 
    return this.optional(element) || value.match(/\b\w+\b/g).length >= params; 
}, "Please enter at least {0} words."); 
 
jQuery.validator.addMethod("rangeWords", function(value, element, params) { 
    return this.optional(element) || value.match(/\b\w+\b/g).length >= params[0] && value.match(/bw+b/g).length < params[1]; 
}, "Please enter between {0} and {1} words.");

jQuery.validator.addMethod("basictext", function(value, element) {
    return this.optional(element) || /^[\wЙЦУКЕЁНГШЩЗХЪЭЖДЛОРПАВЫФЯЧСМИТЬБЮ_йцукеёнгшщзхъэждлорпавыфячсмитьбю№:;.,!\?()'\"\s\-]+$/i.test(value);
}, "Only letters, numbers and basic punctuation please.");

jQuery.validator.addMethod("numeric", function(value, element) {
    return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:,\d{1,3})+)(?:\.\d+)?$/.test(value);
}, "Only numbers and comma, please.");

jQuery.validator.addMethod("login", function(value, element) {
    return this.optional(element) || /^\w+$/i.test(value);
}, "Letters, numbers or underscopes only please");  

jQuery.validator.addMethod("alphanumeric", function(value, element) {
    return this.optional(element) || /^\w+ЙЦУКЕНГШЩЗХЪЭЖДЛОРПАВЫФЯЧСМИТЬБЮ_йцукенгшщзхъэждлорпавыфячсмитьбю$/i.test(value);
}, "Letters, numbers, spaces or underscores only please");  

jQuery.validator.addMethod("lettersonly", function(value, element) {
return this.optional(element) || /^[a-zЙЦУКЕЁНГШЩЗХЪЭЖДЛОРПАВЫФЯЧСМИТЬБЮ_йцукеёнгшщзхъэждлорпавыфячсмитьбю]+$/i.test(value);
}, "Letters only please");

jQuery.validator.addMethod("nowhitespace", function(value, element) {
    return this.optional(element) || /^\S+$/i.test(value);
}, "No white space please"); 

// TODO check if value starts with <, otherwise don't try stripping anything
jQuery.validator.addMethod("strippedminlength", function(value, element, param) {
	return jQuery(value).text().length >= param;
}, jQuery.format("Please enter at least {0} characters"));

// same as email, but TLD is optional
jQuery.validator.addMethod("email2", function(value, element, param) {
	return this.optional(element) || /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)*(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(value); 
}, jQuery.validator.messages.email);

// same as url, but TLD is optional
jQuery.validator.addMethod("url2", function(value, element, param) {
	return this.optional(element) || /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)*(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value);
}, jQuery.validator.messages.url);

jQuery.validator.addMethod("phone", function(value, element) {
    return this.optional(element) || (/^(\+\d)*\s*(\(\d{3}\)\s*)*\d{3}(-{0,1}|\s{0,1})\d{2}(-{0,1}|\s{0,1})\d{2}$/).test(value);
}, jQuery.validator.messages.phone);

jQuery.validator.addMethod("emailStrong", function(value, element) {
    return this.optional(element) || (/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/).test(value);
}, jQuery.validator.messages.emailStrong);
 
jQuery.extend(jQuery.validator.messages, {
    required: "Это поле необходимо заполнить.",
    remote: "Пожалуйста, введите правильное значение.",
    email: "Пожалуйста, введите корретный адрес электронной почты.",
    url: "Пожалуйста, введите корректный URL.",
    date: "Пожалуйста, введите корректную дату.",
    dateISO: "Пожалуйста, введите корректную дату в формате ISO.",
    number: "Пожалуйста, введите число.",
    digits: "Пожалуйста, вводите только цифры.",
    creditcard: "Пожалуйста, введите правильный номер кредитной карты.",
    equalTo: "Пожалуйста, введите такое же значение ещё раз.",
    accept: "Пожалуйста, выберите файл с правильным расширением.",
    maxlength: jQuery.format("Пожалуйста, введите не больше {0} символов."),
    minlength: jQuery.format("Пожалуйста, введите не меньше {0} символов."),
    rangelength: jQuery.format("Пожалуйста, введите значение длиной от {0} до {1} символов."),
    range: jQuery.format("Пожалуйста, введите число от {0} до {1}."),
    max: jQuery.format("Пожалуйста, введите число, меньшее или равное {0}."),
    min: jQuery.format("Пожалуйста, введите число, большее или равное {0}."),
    dateRU: "Введите дату в формате ДД.ММ.ГГГГ.",
    dateTimeRU: "Введите дату в формате ДД.ММ.ГГГГ ЧЧ:ММ.",
    basictext: "Пожалуйста, используйте только буквы, цифры и базовые знаки препинания в этом поле.",
    numeric: "Пожалуйста, используйте только цифры и запятую.",
    login: "Пожалуйста, используйте только латинские буквы, цифры и подчеркивание.",
    phone: "Пожалуйста, введите корректный номер телефона. Например: +7(926)123-45-67 или 777-12-34",
    lettersonly: "Пожалуйста, используйте только буквы.",
    emailStrong: "Пожалуйста, введите корректный адрес электронной почты (только латинские буквы и цифры)"
});